From: Andrew Green Date: Mon, 17 Oct 2016 16:37:36 +0000 (-0500) Subject: MessageCache: Use checkKeys for large messages X-Git-Tag: 1.31.0-rc.0~5071^2 X-Git-Url: http://git.cyclocoop.org/%27%20.%20%24prefix%20.%20Wiki::transformTitleToURI%28%24matches%5B1%5D%29%20.%20%27?a=commitdiff_plain;h=3816a80a2c61cd07ed29f28b3256730e2f1f87b0;p=lhc%2Fweb%2Fwiklou.git MessageCache: Use checkKeys for large messages Also make use of the cache set options and use Revision::newKnownCurrent() to avoid excessive revision table queries during miss periods. Bug: T144952 Change-Id: Ic1c649478b0f87420052d8c99b2962920f8b5c96 --- diff --git a/includes/cache/MessageCache.php b/includes/cache/MessageCache.php index 6834ac0981..ca6e28dcf1 100644 --- a/includes/cache/MessageCache.php +++ b/includes/cache/MessageCache.php @@ -946,28 +946,47 @@ class MessageCache { return false; } - # Try the individual message cache + // Try the individual message cache $titleKey = wfMemcKey( 'messages', 'individual', $title ); - $entry = $this->wanCache->get( $titleKey ); + + $curTTL = null; + $entry = $this->wanCache->get( + $titleKey, + $curTTL, + [ wfMemcKey( 'messages', $code ) ] + ); + $entry = ( $curTTL >= 0 ) ? $entry : false; + if ( $entry ) { if ( substr( $entry, 0, 1 ) === ' ' ) { $this->mCache[$code][$title] = $entry; - - // The message exists, so make sure a string - // is returned. + // The message exists, so make sure a string is returned return (string)substr( $entry, 1 ); } elseif ( $entry === '!NONEXISTENT' ) { $this->mCache[$code][$title] = '!NONEXISTENT'; return false; } else { - # Corrupt/obsolete entry, delete it + // Corrupt/obsolete entry, delete it $this->wanCache->delete( $titleKey ); } } - # Try loading it from the database - $revision = Revision::newFromTitle( Title::makeTitle( NS_MEDIAWIKI, $title ) ); + // Try loading it from the database + $dbr = wfGetDB( DB_REPLICA ); + $cacheOpts = Database::getCacheSetOptions( $dbr ); + // Use newKnownCurrent() to avoid querying revision/user tables + $titleObj = Title::makeTitle( NS_MEDIAWIKI, $title ); + if ( $titleObj->getLatestRevID() ) { + $revision = Revision::newKnownCurrent( + $dbr, + $titleObj->getArticleID(), + $titleObj->getLatestRevID() + ); + } else { + $revision = false; + } + if ( $revision ) { $content = $revision->getContent(); if ( !$content ) { @@ -994,7 +1013,7 @@ class MessageCache { $message = false; // negative caching } else { $this->mCache[$code][$title] = ' ' . $message; - $this->wanCache->set( $titleKey, ' ' . $message, $this->mExpiry ); + $this->wanCache->set( $titleKey, ' ' . $message, $this->mExpiry, $cacheOpts ); } } } else { @@ -1003,7 +1022,7 @@ class MessageCache { if ( $message === false ) { // negative caching $this->mCache[$code][$title] = '!NONEXISTENT'; - $this->wanCache->set( $titleKey, '!NONEXISTENT', $this->mExpiry ); + $this->wanCache->set( $titleKey, '!NONEXISTENT', $this->mExpiry, $cacheOpts ); } return $message;